<?php

class ImpresionsController extends AppController {

    var $name = 'Impresions';
    var $uses = array('Impresion', 'TiendaLocal', 'Facturacion', 'FacturacionDetalle', 'Devolucion', 'DevolucionDetalle', 'Material', 'Plantilla');
    var $helpers = array('Formulario', 'Interfaz', 'AjaxAG');
    var $components = array('Interfaz', 'Maestro', 'Formatos', 'Pdf');
    var $layout = "ajax";

    public function beforeFilter() {
        $this->validar_sesion();
    }
    
    public function afterFilter() {
        $this->auditoria();
    }

    public function guardar() {
        extract($this->request->data);
        $exito = 2;
        $cant = 1;
        $resultado = $imprimirDocs = $tiposDocs = $impresionFlete = array();
        $this->request->data['punto_id'] = $this->Session->read('punto_id');
        $this->request->data['usuario_id'] = $this->Interfaz->id($this->Session->read('usuario_id'));
        $this->request->data['impresion'] = 1;
        $tiendaSesion = $this->Session->read('tiendaBD');

        $objImp = $this->Maestro->modelo('punto', 'Impresion', $tiendaSesion);
        $objNotCre = $this->Maestro->modelo('punto', "NotaCredito", $tiendaSesion);
        
        $verificarImpresion = $objImp->find('count', array('conditions' => array('Impresion.pausa' => 1)));
        $this->request->data['pausa'] = 1;
        
        if($tipo_documento == 'DEV') {
            $objDoc = $this->Maestro->modelo('punto', 'Devolucion', $tiendaSesion);
            $objDocDet = $this->Maestro->modelo('punto', "DevolucionDetalle", $tiendaSesion);
            $buscarDev = $objNotCre->find('first', array('conditions' => array('NotaCredito.id_referencia' => $documento_id, 'NotaCredito.nombre' => 'DEVOLUCION')));
            $buscarDevDetalle = $objDocDet->query("select * FROM fnc_obtener_existencia_material_venta($documento_id, '{$buscarDev['NotaCredito']['fecha']}', 'D') AS detalle");
            $buscarDevDetalle = explode('|' , $buscarDevDetalle[0][0]['detalle']);
            //$tipo_documento = 'NCR';
            $facturaArreglo = array();
            $facturaArreglo['Cabecera']['numero'] = $buscarDev['NotaCredito']['numero'];
            $facturaArreglo['Cabecera']['numero_control'] = $buscarDev['NotaCredito']['numero_control'];
            $facturaArreglo['Cabecera']['clientenombre'] = $buscarDev['Cliente']['nombre'];
            $facturaArreglo['Cabecera']['clientedocumento'] = $buscarDev['Cliente']['documento'];
            $facturaArreglo['Cabecera']['clientedireccion'] = $buscarDev['Cliente']['direccion'];
            $facturaArreglo['Cabecera']['clientetelefono'] = $buscarDev['Cliente']['telefono'];
            $facturaArreglo['Cabecera']['clientecelular'] = $buscarDev['Cliente']['celular'];
            $facturaArreglo['Cabecera']['observacion'] = $buscarDev['NotaCredito']['observacion'];
            $facturaArreglo['Cabecera']['fecha'] = $this->Interfaz->fechatime($buscarDev['NotaCredito']['creado']);
            $facturaArreglo['Cabecera']['division'] = substr($this->Session->read('codigo_punto'), 1);
            $facturaArreglo['Cabecera']['tienda'] = strtoupper($this->Session->read('nombre_punto'));
            $facturaArreglo['Cabecera']['usuario'] = strtoupper($this->Session->read('username'));
            $subTotal = $iva = $total = 0;
            foreach ($buscarDevDetalle as $indice => $valor) {
                $valor = explode('*=*', $valor);
                $precio_neto = $valor[7] * $valor[8];
                $precio_total = $precio_neto * (1 + ($valor[4] / 100));
                $subTotal += $precio_neto;
                $iva += $precio_neto * ($valor[4] / 100);
                $total += $precio_total;
                $facturaArreglo['Detalle'][$indice]['codigo'] = $valor[1];
                $facturaArreglo['Detalle'][$indice]['nombre'] = $valor[2];
                $facturaArreglo['Detalle'][$indice]['cantidad'] = str_pad($valor[8], 2, '0', 0);
                $facturaArreglo['Detalle'][$indice]['precio_venta'] = $this->Interfaz->miles($valor[7]);
                $facturaArreglo['Detalle'][$indice]['impuesto'] = $this->Interfaz->miles($valor[4]);
                $facturaArreglo['Detalle'][$indice]['precio_neto'] = $this->Interfaz->miles($precio_neto);
                $facturaArreglo['Detalle'][$indice]['precio_total'] = $this->Interfaz->miles($precio_total);
            }
            $facturaArreglo['Pie']['totalneto'] = $this->Interfaz->miles($subTotal);
            $facturaArreglo['Pie']['totalimpuesto'] = $this->Interfaz->miles($iva);
            $facturaArreglo['Pie']['totaltotal'] = $this->Interfaz->miles($total);

            $this->request->data['documento_id'] = $buscarDev['NotaCredito']['id'];
            $this->request->data['tipo_documento'] = $tipo_documento;
            $this->request->data['datos'] = json_encode($facturaArreglo);
            $data = $facturaArreglo;
            $resultado['Detalle'][0]['id'] = $this->request->data['documento_id'];
            $resultado['Detalle'][0]['tipo'] = $tipo_documento;
            $resultado['Detalle'][0]['documento'] = $buscarDev['NotaCredito']['numero'];
            $resultado['Detalle'][0]['num_con'] = $buscarDev['NotaCredito']['numero_control'];
            $resultado['Detalle'][0]['estatus'] = $this->request->data['impresion'];
        } else {
            $data = json_decode($this->request->data['datos'], true);
            $resultado['Detalle'][0]['id'] = $this->request->data['documento_id'];
            $resultado['Detalle'][0]['tipo'] = $tipo_documento;
            $resultado['Detalle'][0]['documento'] = $data['Cabecera']['numero'];
            $resultado['Detalle'][0]['num_con'] = $data['Cabecera']['numero_control'];
            $resultado['Detalle'][0]['estatus'] = $this->request->data['impresion'];
        }
        
        $imprimirDocs[] = $data;
        $tiposDocs[] = $tipo_documento;
        if(isset($facturaArreglo))
            unset($facturaArreglo);
        
        $objImp->query('BEGIN WORK');
        if ($objImp->save($this->request->data)) {
            $resultado['Detalle'][0]['id'] = $objImp->id;
            switch ($tipo_documento) {
                case 'FAC':
                    $objDoc = $this->Maestro->modelo('punto', 'Facturacion', $tiendaSesion);
                    $objDocDet = $this->Maestro->modelo('punto', "FacturacionDetalle", $tiendaSesion);
                    $buscarFlete = $objDoc->find('first', array('conditions' => array("Facturacion.padre_id" => $documento_id)));
                    if (empty($buscarFlete))
                        $exito = 1;
                    else {
                        $buscarFleteDetalle = $objDocDet->find('all', array('conditions' => array("FacturacionDetalle.factura_id" => $buscarFlete['Facturacion']['id'])));
                        $facturaArreglo = array();
                        $facturaArreglo['Cabecera']['numero'] = $buscarFlete['Facturacion']['numero'];
                        $facturaArreglo['Cabecera']['numero_control'] = $buscarFlete['Facturacion']['numero_control'];
                        $facturaArreglo['Cabecera']['clientenombre'] = $buscarFlete['Cliente']['nombre'];
                        $facturaArreglo['Cabecera']['clientedocumento'] = $buscarFlete['Cliente']['documento'];
                        $facturaArreglo['Cabecera']['clientedireccion'] = $buscarFlete['Cliente']['direccion'];
                        $facturaArreglo['Cabecera']['clientetelefono'] = $buscarFlete['Cliente']['telefono'];
                        $facturaArreglo['Cabecera']['clientecelular'] = $buscarFlete['Cliente']['celular'];
                        $facturaArreglo['Cabecera']['observacion'] = $buscarFlete['Facturacion']['observacion'];
                        $facturaArreglo['Cabecera']['fecha'] = $this->Interfaz->fechatime($buscarFlete['Facturacion']['creado']);
                        $facturaArreglo['Cabecera']['tipodeventa'] = (isset($buscarFlete['Facturacion']['tipodeventa'])) ? $buscarFlete['Facturacion']['tipodeventa'] : null;
                        $facturaArreglo['Cabecera']['division'] = substr($this->Session->read('codigo_punto'), 1);
                        $facturaArreglo['Cabecera']['tienda'] = strtoupper($this->Session->read('nombre_punto'));
                        $facturaArreglo['Cabecera']['usuario'] = strtoupper($this->Session->read('username'));
                        $subTotal = $iva = $total = 0;
                        foreach ($buscarFleteDetalle as $indice => $valor) {
                            $precio_neto = $valor["FacturacionDetalle"]['precio'] * $valor["FacturacionDetalle"]['cantidad'];
                            $precio_total = $precio_neto * (1 + ($valor["FacturacionDetalle"]['impuesto'] / 100));
                            $subTotal += $precio_neto;
                            $iva += $precio_neto * ($valor["FacturacionDetalle"]['impuesto'] / 100);
                            $total += $precio_total;
                            $facturaArreglo['Detalle'][$indice]['codigo'] = '';
                            $facturaArreglo['Detalle'][$indice]['nombre'] = 'MANEJO LOG&Iacute;STICO';
                            $facturaArreglo['Detalle'][$indice]['cantidad'] = str_pad($valor["FacturacionDetalle"]['cantidad'], 2, '0', 0);
                            $facturaArreglo['Detalle'][$indice]['precio_venta'] = $this->Interfaz->miles($valor["FacturacionDetalle"]['precio']);
                            $facturaArreglo['Detalle'][$indice]['impuesto'] = $this->Interfaz->miles($valor["FacturacionDetalle"]['impuesto']);
                            $facturaArreglo['Detalle'][$indice]['precio_neto'] = $this->Interfaz->miles($precio_neto);
                            $facturaArreglo['Detalle'][$indice]['precio_total'] = $this->Interfaz->miles($precio_total);
                        }
                        $facturaArreglo['Pie']['totalneto'] = $this->Interfaz->miles($subTotal);
                        $facturaArreglo['Pie']['totalimpuesto'] = $this->Interfaz->miles($iva);
                        $facturaArreglo['Pie']['totaltotal'] = $this->Interfaz->miles($total);

                        $impresionFlete[1]['Impresion']['documento_id'] = $buscarFlete['Facturacion']['id'];
                        $impresionFlete[1]['Impresion']['tipo_documento'] = $tipo_documento;
                        $impresionFlete[1]['Impresion']['punto_id'] = $this->Session->read('punto_id');
                        $impresionFlete[1]['Impresion']['usuario_id'] = $this->Interfaz->id($this->Session->read('usuario_id'));
                        $impresionFlete[1]['Impresion']['impresion'] = 1;
                        $impresionFlete[1]['Impresion']['pausa'] = 1;
                        $impresionFlete[1]['Impresion']['datos'] = json_encode($facturaArreglo);
                        $resultado['Detalle'][2]['id'] = $buscarFlete['Facturacion']['id'];
                        $resultado['Detalle'][2]['tipo'] = $tipo_documento;
                        $resultado['Detalle'][2]['documento'] = $buscarFlete['Facturacion']['numero'];
                        $resultado['Detalle'][2]['num_con'] = $buscarFlete['Facturacion']['numero_control'];
                        $resultado['Detalle'][2]['estatus'] = 1;
                        $cant++;
                    }
                    
                    $buscarNotCre = $objNotCre->find('first', array('conditions' => array('NotaCredito.id_referencia' => $documento_id, 'NotaCredito.nombre' => 'FACTURA')));
                    if(!empty($buscarNotCre)) {
                        $notCreArreglo = array();
                        $notCreArreglo['Cabecera']['numero'] = $buscarNotCre['NotaCredito']['numero'];
                        $notCreArreglo['Cabecera']['numero_control'] = $buscarNotCre['NotaCredito']['numero_control'];
                        $notCreArreglo['Cabecera']['clientenombre'] = $buscarNotCre['Cliente']['nombre'];
                        $notCreArreglo['Cabecera']['clientedocumento'] = $buscarNotCre['Cliente']['documento'];
                        $notCreArreglo['Cabecera']['clientedireccion'] = $buscarNotCre['Cliente']['direccion'];
                        $notCreArreglo['Cabecera']['clientetelefono'] = $buscarNotCre['Cliente']['telefono'];
                        $notCreArreglo['Cabecera']['clientecelular'] = $buscarNotCre['Cliente']['celular'];
                        $notCreArreglo['Cabecera']['observacion'] = $buscarNotCre['NotaCredito']['observacion'];
                        $notCreArreglo['Cabecera']['fecha'] = $this->Interfaz->fechatime($buscarNotCre['NotaCredito']['creado']);
                        $notCreArreglo['Cabecera']['division'] = substr($this->Session->read('codigo_punto'), 1);
                        $notCreArreglo['Cabecera']['tienda'] = strtoupper($this->Session->read('nombre_punto'));
                        $notCreArreglo['Cabecera']['usuario'] = strtoupper($this->Session->read('username'));
                        $notCreArreglo['Pie']['totaltotal'] = $this->Interfaz->miles($buscarNotCre['NotaCredito']['monto']);
                        $resultado['Detalle'][1]['id'] = $buscarNotCre['NotaCredito']['id'];
                        $resultado['Detalle'][1]['tipo'] = 'NCR';
                        $resultado['Detalle'][1]['documento'] = $buscarNotCre['NotaCredito']['numero'];
                        $resultado['Detalle'][1]['num_con'] = $buscarNotCre['NotaCredito']['numero_control'];
                        $resultado['Detalle'][1]['estatus'] = 1;
                        $cant++;
                    }
                break;
                case 'DEV':
                    $objDocDet = $this->Maestro->modelo('punto', "DevolucionDetalle", $tiendaSesion);
                    $buscarDevDetalleFlete = $objDoc->find('first', array('conditions' => array("Devolucion.padre_id" => $documento_id)));
                    if(empty($buscarDevDetalleFlete))
                        $exito = 1;
                    else {
                        $buscarFlete = $objNotCre->find('first', array('conditions' => array('NotaCredito.id_referencia' => $buscarDevDetalleFlete['Devolucion']['id'], 'NotaCredito.nombre' => 'DEVOLUCION')));
                        $buscarFleteDetalle = $objDocDet->find('all', array('conditions' => array("DevolucionDetalle.devolucion_id" => $buscarDevDetalleFlete['Devolucion']['id'])));
                        $facturaArreglo = array();
                        $facturaArreglo['Cabecera']['numero'] = $buscarFlete['NotaCredito']['numero'];
                        $facturaArreglo['Cabecera']['numero_control'] = $buscarFlete['NotaCredito']['numero_control'];
                        $facturaArreglo['Cabecera']['clientenombre'] = $buscarFlete['Cliente']['nombre'];
                        $facturaArreglo['Cabecera']['clientedocumento'] = $buscarFlete['Cliente']['documento'];
                        $facturaArreglo['Cabecera']['clientedireccion'] = $buscarFlete['Cliente']['direccion'];
                        $facturaArreglo['Cabecera']['clientetelefono'] = $buscarFlete['Cliente']['telefono'];
                        $facturaArreglo['Cabecera']['clientecelular'] = $buscarFlete['Cliente']['celular'];
                        $facturaArreglo['Cabecera']['observacion'] = $buscarFlete['NotaCredito']['observacion'];
                        $facturaArreglo['Cabecera']['fecha'] = $this->Interfaz->fechatime($buscarFlete['NotaCredito']['creado']);
                        $facturaArreglo['Cabecera']['division'] = substr($this->Session->read('codigo_punto'), 1);
                        $facturaArreglo['Cabecera']['tienda'] = strtoupper($this->Session->read('nombre_punto'));
                        $facturaArreglo['Cabecera']['usuario'] = strtoupper($this->Session->read('username'));
                        $subTotal = $iva = $total = 0;
                        foreach ($buscarFleteDetalle as $indice => $valor) {
                            $precio_neto = $valor["DevolucionDetalle"]['precio'] * $valor["DevolucionDetalle"]['cantidad'];
                            $precio_total = $precio_neto * (1 + ($valor["DevolucionDetalle"]['impuesto'] / 100));
                            $subTotal += $precio_neto;
                            $iva += $precio_neto * ($valor["DevolucionDetalle"]['impuesto'] / 100);
                            $total += $precio_total;
                            $facturaArreglo['Detalle'][$indice]['codigo'] = '';
                            $facturaArreglo['Detalle'][$indice]['nombre'] = 'MANEJO LOG&Iacute;STICO';
                            $facturaArreglo['Detalle'][$indice]['cantidad'] = str_pad($valor["DevolucionDetalle"]['cantidad'], 2, '0', 0);
                            $facturaArreglo['Detalle'][$indice]['precio_venta'] = $this->Interfaz->miles($valor["DevolucionDetalle"]['precio']);
                            $facturaArreglo['Detalle'][$indice]['impuesto'] = $this->Interfaz->miles($valor["DevolucionDetalle"]['impuesto']);
                            $facturaArreglo['Detalle'][$indice]['precio_neto'] = $this->Interfaz->miles($precio_neto);
                            $facturaArreglo['Detalle'][$indice]['precio_total'] = $this->Interfaz->miles($precio_total);
                        }
                        $facturaArreglo['Pie']['totalneto'] = $this->Interfaz->miles($subTotal);
                        $facturaArreglo['Pie']['totalimpuesto'] = $this->Interfaz->miles($iva);
                        $facturaArreglo['Pie']['totaltotal'] = $this->Interfaz->miles($total);

                        $impresionFlete[1]['Impresion']['documento_id'] = $buscarFlete['NotaCredito']['id'];
                        $impresionFlete[1]['Impresion']['tipo_documento'] = $tipo_documento;
                        $impresionFlete[1]['Impresion']['punto_id'] = $this->Session->read('punto_id');
                        $impresionFlete[1]['Impresion']['usuario_id'] = $this->Interfaz->id($this->Session->read('usuario_id'));
                        $impresionFlete[1]['Impresion']['impresion'] = 1;
                        $impresionFlete[1]['Impresion']['pausa'] = 1;
                        $impresionFlete[1]['Impresion']['datos'] = json_encode($facturaArreglo);
                        $resultado['Detalle'][1]['id'] = $buscarFlete['NotaCredito']['id'];
                        $resultado['Detalle'][1]['tipo'] = $tipo_documento;
                        $resultado['Detalle'][1]['documento'] = $buscarFlete['NotaCredito']['numero'];
                        $resultado['Detalle'][1]['num_con'] = $buscarFlete['NotaCredito']['numero_control'];
                        $resultado['Detalle'][1]['estatus'] = 1;
                        $cant++;
                    }
                break;
                default:
                    $exito = 1;
                break;
            }
            
            if(isset($facturaArreglo) && !empty($facturaArreglo)) {
                $imprimirDocs[] = $facturaArreglo;
                $tiposDocs[] = $tipo_documento;
            }

            if(isset($buscarNotCre) && !empty($buscarNotCre)) {
                $impresionFlete[0]['Impresion']['documento_id'] = $buscarNotCre['NotaCredito']['id'];
                $impresionFlete[0]['Impresion']['tipo_documento'] = 'NCR';
                $impresionFlete[0]['Impresion']['punto_id'] = $this->Session->read('punto_id');
                $impresionFlete[0]['Impresion']['usuario_id'] = $this->Interfaz->id($this->Session->read('usuario_id'));
                $impresionFlete[0]['Impresion']['impresion'] = 1;
                $impresionFlete[0]['Impresion']['pausa'] = 1;
                $impresionFlete[0]['Impresion']['datos'] = json_encode($notCreArreglo);
                $imprimirDocs[] = $notCreArreglo;
                $tiposDocs[] = $tipo_documento;
            }

            if (in_array($tipo_documento, array('FAC', 'DEV')) && !empty($impresionFlete)) {
                ksort($impresionFlete);
                if ($objImp->saveAll($impresionFlete))
                    $exito = 1;
            }
        }
        
        if($exito)
            $objImp->query('COMMIT');
        else
            $objImp->query('ROLLBACK');
        
        $resultado['resultado'] = $exito;
        $resultado['cantidad'] = $cant;
        $resultado['limite'] = $cant;
        ksort($resultado['Detalle']);
        $resultado['Detalle'] = array_values($resultado['Detalle']);
        if(count($impresionFlete) > 0) {
            $resultado['Detalle'][1]['id'] = $objImp->inserted_ids[1];
            if(count($impresionFlete) > 1)
                $resultado['Detalle'][2]['id'] = $objImp->inserted_ids[2];
        }
        echo json_encode($resultado);
        $this->autoRender = false;
    }
    
    public function consultar() {
        sleep(1);
        extract($this->request->data);
        $idCaja = $this->Session->read('punto_id');
        $cant = 0;
        $tiendaSesion = $this->Session->read('tiendaBD');
        $objImp = $this->Maestro->modelo('punto', 'Impresion', $tiendaSesion);

        $cola = $objImp->find('all', array('fields' => array('Impresion.punto_id', 'Impresion.creado'), 'conditions' => array('Impresion.pausa' => 1, 'Impresion.tipo_documento !=' => 'REP'), 'order' => array('Impresion.creado', 'Impresion.id')));
        if(!empty($cola)) {
            if($cola[0]['Impresion']['punto_id'] == $idCaja)
                $cant = 0;
            else {
                foreach($cola as $indice => $valor) {
                    if($valor['Impresion']['punto_id'] != $idCaja)
                        $cant += 1;
                }
            }
        }
        echo $cant;
        $this->autoRender = false;
    }
    
    public function reImpresion() {
        extract($this->request->data);
        $idCaja = $this->Session->read('punto_id');
        $tiendaSesion = $this->Session->read('tiendaBD');
        $imprimirDocs = $tiposDocs = array();
        $ObjClavePermiso = $this->Maestro->modelo('punto', 'ClavePermiso', $tiendaSesion);
        $objImpre = $this->Maestro->modelo('punto', 'Impresion', $tiendaSesion);

        $errorImprimir = '';
        if($clave != '')  {
            $misDatos = $ObjClavePermiso->find('all', array('conditions' => array('ClavePermiso.punto_id' => $idCaja, 'ClavePermiso.estatus' => 1, 'ClavePermiso.clave' => $clave, 'ClavePermiso.tipo' => 'impresionExtra')));
            if(empty($misDatos)) {
                $errorImprimir = '4_|_La contraseña es incorrecta';
            }
            $tipoImpresion = 'C';
        } else {
            $tipoImpresion = 'R';
        }

        if(empty($errorImprimir)) {
            $documentoImprimir = array();
            if(!empty($primerDocumento)) {
                list($idFac, $tipoFac) = explode('-', $primerDocumento);
                $documentoImprimir[] = array('id' => $idFac, 'tipo' => $tipoFac);
            }
            if(!empty($segundoDocumento)) {
                list($idFac, $tipoFac) = explode('-', $segundoDocumento);
                $documentoImprimir[] = array('id' => $idFac, 'tipo' => $tipoFac);
            }

            $dataSave = null;
            $errores = array();
            $resultado = array();
            $cant = 1;
            $numDoc = '';
            $numConDoc = '-';
            $objImpre->query('BEGIN');
            foreach ($documentoImprimir as $indice => $valores) {
                $dataLimpia = '';
                $datosImpre = $objImpre->find('first', array('conditions' => array('Impresion.documento_id' =>  $valores['id'], 'Impresion.tipo_documento' => $valores['tipo'])));
                $dataSave['documento_id'] = $valores['id'];
                $dataSave['tipo_documento'] = $valores['tipo'];
                $dataSave['punto_id'] = $idCaja;
                $dataSave['usuario_id'] = $this->Interfaz->id($this->Session->read('usuario_id'));
                $dataSave['impresion'] = 1;
                $dataSave['estatus'] = 1;
                $dataSave['pausa'] = 1;
                $dataSave['tipo_impresion'] = $tipoImpresion;

                if(!empty($datosImpre)) {
                    if($tipoImpresion == 'C') {
                        $nombreUsuario = strtoupper($this->Session->read('username'));
                        $jsonCopiado = $datosImpre['Impresion']['datos'];
                        $jsonExpresionado = preg_replace('/(.+)(\"usuario\"\:)(\"[a-zA-Z0-0]+\")(.+)/', '$1$2"' . $nombreUsuario . '"$4', $jsonCopiado);
                        $dataSave['datos'] = $jsonExpresionado;
                    } else {
                        $dataSave['datos'] = $datosImpre['Impresion']['datos'];

                        if($valores['tipo'] == 'COT' or $valores['tipo'] == 'CTO') {
                            $dataSave['tipo_impresion'] = 'C';
                        }
                    }
                    $imprimirDocs[] = $dataLimpia = json_decode($datosImpre['Impresion']['datos'], true);
                    $numDoc = $dataLimpia['Cabecera']['numero'];
                    $numConDoc = $dataLimpia['Cabecera']['numero_control'];
                    $tiposDocs[] = $valores['tipo'];

                } else {
                    $idDocumento = $valores['id'];
                    $tiposDocs[] = $tipoDocumento = $valores['tipo'];

                    switch ($tipoDocumento) {
                        case 'FAC':
                            $objDoc = $this->Maestro->modelo('punto', 'Facturacion', $tiendaSesion);
                            $objDocDet = $this->Maestro->modelo('punto', "FacturacionDetalle", $tiendaSesion);
                            $laFactura = $objDoc->find('first', array('conditions' => array("Facturacion.id" => $idDocumento)));
                            
                            if(!empty($laFactura)) {

                                if(($tipoImpresion != 'C') or ($tipoImpresion == 'C' and $laFactura['Facturacion']['estatus'] == '1')) {

                                    $facturaArreglo = array();
                                    $buscarFacDetalle = $objDocDet->query("select * FROM fnc_obtener_existencia_material_venta($idDocumento, '{$laFactura['Facturacion']['fecha']}', 'F') AS detalle");
                                    $buscarFacDetalle = explode('|' , $buscarFacDetalle[0][0]['detalle']);
                                    foreach ($buscarFacDetalle as $indice => $valor) {
                                        $valoresDetalles = explode('*=*', $valor);
                                        $facturaArregloNombre['Detalle'][$indice]['codigo'] = $valoresDetalles[1];
                                        $facturaArregloNombre['Detalle'][$indice]['nombre'] = $valoresDetalles[2];
                                    }
                                    $numDoc = $laFactura['Facturacion']['numero'];
                                    $numConDoc = $laFactura['Facturacion']['numero_control'];
                                    $facturaArreglo['Cabecera']['numero'] = $laFactura['Facturacion']['numero'];
                                    $facturaArreglo['Cabecera']['numero_control'] = $laFactura['Facturacion']['numero_control'];
                                    $facturaArreglo['Cabecera']['clientenombre'] = $laFactura['Cliente']['nombre'];
                                    $facturaArreglo['Cabecera']['clientedocumento'] = $laFactura['Cliente']['documento'];
                                    $facturaArreglo['Cabecera']['clientedireccion'] = $laFactura['Cliente']['direccion'];
                                    $facturaArreglo['Cabecera']['clientetelefono'] = $laFactura['Cliente']['telefono'];
                                    $facturaArreglo['Cabecera']['clientecelular'] = $laFactura['Cliente']['celular'];
                                    $facturaArreglo['Cabecera']['observacion'] = $laFactura['Facturacion']['observacion'];
                                    $facturaArreglo['Cabecera']['fecha'] = $this->Interfaz->fechatime($laFactura['Facturacion']['creado']);
                                    $facturaArreglo['Cabecera']['tipodeventa'] = (isset($laFactura['Facturacion']['tipodeventa'])) ? $laFactura['Facturacion']['tipodeventa'] : null;
                                    $facturaArreglo['Cabecera']['division'] = substr($this->Session->read('codigo_punto'), 1);
                                    $facturaArreglo['Cabecera']['tienda'] = strtoupper($this->Session->read('nombre_punto'));
                                    $facturaArreglo['Cabecera']['usuario'] = strtoupper($this->Session->read('username'));
                                    $subTotal = $iva = $total = 0;
                                    $facturaDetalle = $objDocDet->find('all', array('conditions' => array("FacturacionDetalle.factura_id" => $laFactura['Facturacion']['id'])));
                                    foreach ($facturaDetalle as $indice => $valor) {
                                        $precio_neto = $valor["FacturacionDetalle"]['precio'] * $valor["FacturacionDetalle"]['cantidad'];
                                        $precio_total = $precio_neto * (1 + ($valor["FacturacionDetalle"]['impuesto'] / 100));
                                        $subTotal += $precio_neto;
                                        $iva += $precio_neto * ($valor["FacturacionDetalle"]['impuesto'] / 100);
                                        $total += $precio_total;
                                        $facturaArreglo['Detalle'][$indice]['codigo'] = $facturaArregloNombre['Detalle'][$indice]['codigo'];
                                        $facturaArreglo['Detalle'][$indice]['nombre'] = $facturaArregloNombre['Detalle'][$indice]['nombre'];
                                        $facturaArreglo['Detalle'][$indice]['cantidad'] = str_pad($valor["FacturacionDetalle"]['cantidad'], 2, '0', 0);
                                        $facturaArreglo['Detalle'][$indice]['precio_venta'] = $this->Interfaz->miles($valor["FacturacionDetalle"]['precio']);
                                        $facturaArreglo['Detalle'][$indice]['impuesto'] = $this->Interfaz->miles($valor["FacturacionDetalle"]['impuesto']);
                                        $facturaArreglo['Detalle'][$indice]['precio_neto'] = $this->Interfaz->miles($precio_neto);
                                        $facturaArreglo['Detalle'][$indice]['precio_total'] = $this->Interfaz->miles($precio_total);
                                    }
                                    $facturaArreglo['Pie']['totalneto'] = $this->Interfaz->miles($subTotal);
                                    $facturaArreglo['Pie']['totalimpuesto'] = $this->Interfaz->miles($iva);
                                    $facturaArreglo['Pie']['totaltotal'] = $this->Interfaz->miles($total);
                                    $dataSave['datos'] = json_encode($facturaArreglo);
                                    $imprimirDocs[] = $facturaArreglo;
                                }
                                else {
                                    $errores[] = 'ERROR';
                                    $errores['mensaje'] = 'No se puede imprimir, la factura presenta un estatus distinto a facturada';
                                }
                            } else {
                                $errores[] = 'ERROR';
                            }
                        break;
                        case 'DEV':
                            $objDoc = $this->Maestro->modelo('punto', 'Devolucion', $tiendaSesion);
                            $objDocDet = $this->Maestro->modelo('punto', "DevolucionDetalle", $tiendaSesion);
                            $laDevolucion = $objNotCre->find('first', array('conditions' => array('NotaCredito.id_referencia' => $idDocumento, 'NotaCredito.nombre' => 'DEVOLUCION')));
                            if(!empty($laDevolucion)) {
                                $devolucionArreglo = array();
                                $buscarFacDetalle = $objDocDet->query("select * FROM fnc_obtener_existencia_material_venta($idDocumento, '{$laDevolucion['Devolucion']['fecha']}', 'D') AS detalle");
                                $buscarFacDetalle = explode('|' , $buscarFacDetalle[0][0]['detalle']);
                                foreach ($buscarFacDetalle as $indice => $valor) {
                                    $valoresDetalles = explode('*=*', $valor);
                                    $devolucionArregloNombre['Detalle'][$indice]['codigo'] = $valoresDetalles[1];
                                    $devolucionArregloNombre['Detalle'][$indice]['nombre'] = $valoresDetalles[2];
                                }
                                $numDoc = $laDevolucion['Devolucion']['numero'];
                                $numConDoc = $laDevolucion['Devolucion']['numero_control'];
                                $devolucionArreglo['Cabecera']['numero'] = $laDevolucion['Devolucion']['numero'];
                                $devolucionArreglo['Cabecera']['numero_control'] = $laDevolucion['Devolucion']['numero_control'];
                                $devolucionArreglo['Cabecera']['clientenombre'] = $laDevolucion['Cliente']['nombre'];
                                $devolucionArreglo['Cabecera']['clientedocumento'] = $laDevolucion['Cliente']['documento'];
                                $devolucionArreglo['Cabecera']['clientedireccion'] = $laDevolucion['Cliente']['direccion'];
                                $devolucionArreglo['Cabecera']['clientetelefono'] = $laDevolucion['Cliente']['telefono'];
                                $devolucionArreglo['Cabecera']['clientecelular'] = $laDevolucion['Cliente']['celular'];
                                $devolucionArreglo['Cabecera']['observacion'] = $laDevolucion['Devolucion']['observacion'];
                                $devolucionArreglo['Cabecera']['fecha'] = $this->Interfaz->fechatime($laDevolucion['Devolucion']['creado']);
                                $devolucionArreglo['Cabecera']['tipodeventa'] = (isset($laDevolucion['Devolucion']['tipodeventa'])) ? $laDevolucion['Devolucion']['tipodeventa'] : null;
                                $devolucionArreglo['Cabecera']['division'] = substr($this->Session->read('codigo_punto'), 1);
                                $devolucionArreglo['Cabecera']['tienda'] = strtoupper($this->Session->read('nombre_punto'));
                                $devolucionArreglo['Cabecera']['usuario'] = strtoupper($this->Session->read('username'));
                                $subTotal = $iva = $total = 0;
                                $devolucionDetalle = $objDocDet->find('all', array('conditions' => array("DevolucionDetalle.devolucion_id" => $laDevolucion['Devolucion']['id'])));
                                foreach ($devolucionDetalle as $indice => $valor) {
                                    $precio_neto = $valor["DevolucionDetalle"]['precio'] * $valor["DevolucionDetalle"]['cantidad'];
                                    $precio_total = $precio_neto * (1 + ($valor["DevolucionDetalle"]['impuesto'] / 100));
                                    $subTotal += $precio_neto;
                                    $iva += $precio_neto * ($valor["DevolucionDetalle"]['impuesto'] / 100);
                                    $total += $precio_total;
                                    $devolucionArreglo['Detalle'][$indice]['codigo'] = $devolucionArregloNombre['Detalle'][$indice]['codigo'];
                                    $devolucionArreglo['Detalle'][$indice]['nombre'] = $devolucionArregloNombre['Detalle'][$indice]['nombre'];
                                    $devolucionArreglo['Detalle'][$indice]['cantidad'] = str_pad($valor["DevolucionDetalle"]['cantidad'], 2, '0', 0);
                                    $devolucionArreglo['Detalle'][$indice]['precio_venta'] = $this->Interfaz->miles($valor["DevolucionDetalle"]['precio']);
                                    $devolucionArreglo['Detalle'][$indice]['impuesto'] = $this->Interfaz->miles($valor["DevolucionDetalle"]['impuesto']);
                                    $devolucionArreglo['Detalle'][$indice]['precio_neto'] = $this->Interfaz->miles($precio_neto);
                                    $devolucionArreglo['Detalle'][$indice]['precio_total'] = $this->Interfaz->miles($precio_total);
                                }
                                $devolucionArreglo['Pie']['totalneto'] = $this->Interfaz->miles($subTotal);
                                $devolucionArreglo['Pie']['totalimpuesto'] = $this->Interfaz->miles($iva);
                                $devolucionArreglo['Pie']['totaltotal'] = $this->Interfaz->miles($total);
                                $dataSave['datos'] = json_encode($devolucionArreglo);
                                $imprimirDocs[] = $devolucionArreglo;
                            } else {
                                $errores[] = 'ERROR';
                            }
                        break;
                        case 'COT':
                            $objDoc = $this->Maestro->modelo('punto', 'Cotizacion', $tiendaSesion);
                            $objDocDet = $this->Maestro->modelo('punto', "CotizacionDetalle", $tiendaSesion);
                            $laCotizacion = $objDoc->find('first', array('conditions' => array("Cotizacion.id" => $idDocumento)));
                            if(!empty($laCotizacion)) {
                                $cotizacionArreglo = array();
                                $buscarCotDetalle = $objDocDet->query("select * FROM fnc_obtener_existencia_material_venta($idDocumento, '{$laCotizacion['Cotizacion']['fecha']}', 'C') AS detalle");
                                $buscarCotDetalle = explode('|' , $buscarCotDetalle[0][0]['detalle']);
                                foreach ($buscarCotDetalle as $indice => $valor) {
                                    $valoresDetalles = explode('*=*', $valor);
                                    $cotizacionArregloNombre['Detalle'][$indice]['codigo'] = $valoresDetalles[1];
                                    $cotizacionArregloNombre['Detalle'][$indice]['nombre'] = $valoresDetalles[2];
                                }
                                $numDoc = $laCotizacion['Cotizacion']['numero'];
                                $numConDoc = '-';
                                $cotizacionArreglo['Cabecera']['numero'] = $laCotizacion['Cotizacion']['numero'];
                                $cotizacionArreglo['Cabecera']['numero_control'] = '-';
                                $cotizacionArreglo['Cabecera']['clientenombre'] = $laCotizacion['Cliente']['nombre'];
                                $cotizacionArreglo['Cabecera']['clientedocumento'] = $laCotizacion['Cliente']['documento'];
                                $cotizacionArreglo['Cabecera']['clientedireccion'] = $laCotizacion['Cliente']['direccion'];
                                $cotizacionArreglo['Cabecera']['clientetelefono'] = $laCotizacion['Cliente']['telefono'];
                                $cotizacionArreglo['Cabecera']['clientecelular'] = $laCotizacion['Cliente']['celular'];
                                $cotizacionArreglo['Cabecera']['observacion'] = $laCotizacion['Cotizacion']['observaciones'];
                                $cotizacionArreglo['Cabecera']['fecha'] = $this->Interfaz->fechatime($laCotizacion['Cotizacion']['creado']);
                                $cotizacionArreglo['Cabecera']['tipodeventa'] = (isset($laCotizacion['Cotizacion']['tipodeventa'])) ? $laCotizacion['Cotizacion']['tipodeventa'] : null;
                                $cotizacionArreglo['Cabecera']['division'] = substr($this->Session->read('codigo_punto'), 1);
                                $cotizacionArreglo['Cabecera']['tienda'] = strtoupper($this->Session->read('nombre_punto'));
                                $cotizacionArreglo['Cabecera']['usuario'] = strtoupper($this->Session->read('username'));
                                $subTotal = $iva = $total = 0;
                                $cotizacionDetalle = $objDocDet->find('all', array('conditions' => array("CotizacionDetalle.cotizacion_id" => $laCotizacion['Cotizacion']['id'])));
                                
                                foreach ($cotizacionDetalle as $indice => $valor) {
                                    $precio_neto = $valor["CotizacionDetalle"]['precio'] * $valor["CotizacionDetalle"]['cantidad'];
                                    $precio_total = $precio_neto * (1 + ($valor["CotizacionDetalle"]['impuesto'] / 100));
                                    $subTotal += $precio_neto;
                                    $iva += $precio_neto * ($valor["CotizacionDetalle"]['impuesto'] / 100);
                                    $total += $precio_total;
                                    $cotizacionArreglo['Detalle'][$indice]['codigo'] = $cotizacionArregloNombre['Detalle'][$indice]['codigo'];
                                    $cotizacionArreglo['Detalle'][$indice]['nombre'] = $cotizacionArregloNombre['Detalle'][$indice]['nombre'];
                                    $cotizacionArreglo['Detalle'][$indice]['cantidad'] = str_pad($valor["CotizacionDetalle"]['cantidad'], 2, '0', 0);
                                    $cotizacionArreglo['Detalle'][$indice]['precio_venta'] = $this->Interfaz->miles($valor["CotizacionDetalle"]['precio']);
                                    $cotizacionArreglo['Detalle'][$indice]['impuesto'] = $this->Interfaz->miles($valor["CotizacionDetalle"]['impuesto']);
                                    $cotizacionArreglo['Detalle'][$indice]['precio_neto'] = $this->Interfaz->miles($precio_neto);
                                    $cotizacionArreglo['Detalle'][$indice]['precio_total'] = $this->Interfaz->miles($precio_total);
                                }
                                
                                $cotizacionArreglo['Pie']['totalneto'] = $this->Interfaz->miles($subTotal);
                                $cotizacionArreglo['Pie']['totalimpuesto'] = $this->Interfaz->miles($iva);
                                $cotizacionArreglo['Pie']['totaltotal'] = $this->Interfaz->miles($total);

                                //SIEMPRE COMO CORRELATIVO
                                $dataSave['tipo_impresion'] = 'C';

                                $dataSave['datos'] = json_encode($cotizacionArreglo);
                                $imprimirDocs[] = $cotizacionArreglo;
                            } else {
                                $errores[] = 'ERROR';
                            }
                        break;
                        case 'CTO':
                            $objDoc = $this->Maestro->modelo('punto', 'CartaOrden', $tiendaSesion);
                            $objDocDet = $this->Maestro->modelo('punto', "CartaOrdenDetalle", $tiendaSesion);
                            $laCartaOrden = $objDoc->find('first', array('conditions' => array("CartaOrden.id" => $idDocumento)));

                            if(!empty($laCartaOrden)) {

                                $tiempo = $laCartaOrden['CartaOrden']['creado'];
                                list($fechaCTO, $horaCTO) = explode(' ', $tiempo);
                                $fecha = implode('-', array_reverse(explode('-', $fechaCTO)));

                                $cartaOrdenArreglo = array();
                                $numDoc = $laCartaOrden['CartaOrden']['numero'];
                                $numConDoc = $laCartaOrden['CartaOrden']['numero_control'];
                                $cartaOrdenArreglo['Cabecera']['numero'] = $laCartaOrden['CartaOrden']['numero'];
                                $cartaOrdenArreglo['Cabecera']['numero_control'] = $laCartaOrden['CartaOrden']['numero_control'];
                                $cartaOrdenArreglo['Cabecera']['clientenombre'] = $laCartaOrden['Cliente']['nombre'];
                                $cartaOrdenArreglo['Cabecera']['clientedocumento'] = $laCartaOrden['Cliente']['documento'];
                                $cartaOrdenArreglo['Cabecera']['clientedireccion'] = $laCartaOrden['Cliente']['direccion'];
                                $cartaOrdenArreglo['Cabecera']['observacion'] = $laCartaOrden['CartaOrden']['observacion'];
                                $cartaOrdenArreglo['Cabecera']['fecha'] = $this->Interfaz->fechatime($laCartaOrden['CartaOrden']['creado']);
                                $cartaOrdenArreglo['Cabecera']['rubro'] = $laCartaOrden['Rubro']['nombre'];

                                $cartaDetalle = $objDocDet->find('all', array('conditions' => array("CartaOrdenDetalle.carta_orden_id" => $idDocumento)));

                                $montoTotal = 0;
                                foreach($cartaDetalle as $indice => $valor){

                                    $cartaOrdenArreglo['Detalle'][$indice]['codigo'] = $valor['Clasificacion']['codigo'];
                                    $cartaOrdenArreglo['Detalle'][$indice]['nombre'] = $valor['Clasificacion']['nombre'];
                                    $cartaOrdenArreglo['Detalle'][$indice]['monto'] = $valor['CartaOrdenDetalle']['monto'];

                                    $montoTotal += $valor['CartaOrdenDetalle']['monto'];
                                }
                                $cartaOrdenArreglo['Pie']['totalneto'] = $montoTotal;

                                //SIEMPRE COMO CORRELATIVO
                                $dataSave['tipo_impresion'] = 'C';

                                $dataSave['datos'] = json_encode($cartaOrdenArreglo);
                                $imprimirDocs[] = $cartaOrdenArreglo;
                            } else {
                                $errores[] = 'ERROR';
                            }

                        break;
                        default:
                            $errores[] = 'ERROR';
                        break;
                    }
                }

                $resultado['Detalle'][$indice]['id'] = $valores['id'];
                $resultado['Detalle'][$indice]['tipo'] = $valores['tipo'];
                $resultado['Detalle'][$indice]['documento'] = $numDoc;
                $resultado['Detalle'][$indice]['num_con'] = $numConDoc;
                $resultado['Detalle'][$indice]['estatus'] = 1;
                $cant++;
                $objImpre->create();
                if($objImpre->save($dataSave))
                    $resultado['Detalle'][$indice]['id'] = $objImpre->id;
                else
                    $errores[] = 'ERROR';
            }

            $cant -= 1;

            $this->data = null;
            if(empty($errores)) {
                if($clave != '')  {
                   $modificarClave = $ObjClavePermiso->updateAll(array('ClavePermiso.estatus' => 0), array('ClavePermiso.punto_id' => $idCaja, 'ClavePermiso.estatus' => 1, 'ClavePermiso.clave' => $clave));
                } else {
                    $modificarClave = true;
                }
                if($modificarClave) {
                    $objImpre->query('COMMIT');
                    $resultado['resultado'] = 1;
                    $resultado['cantidad'] = $cant;
                    $resultado['limite'] = $cant;
                    echo "1_|_" . json_encode($resultado);
                } else {
                    $objImpre->query('ROLLBACK');
                    echo "2_|_ROLLBACK CLAVE...";
                }
            } else {
                $objImpre->query('ROLLBACK');
                
                if(isset($errores['mensaje'])) {
                    echo "3_|_" . $errores['mensaje'];
                }
                else {
                    echo "2_|_ROLLBACK DATA...";
                }
            }           
        } else {
            echo $errorImprimir;
        }

        $this->autoRender = false;
    }
    
    public function actualizarDocumento() {
        $tiendaSesion = $this->Session->read('tiendaBD');
        $objImp = $this->Maestro->modelo('punto', 'Impresion', $tiendaSesion);
        
        $objImp->save($this->request->data);
        $this->autoRender = false;
    }

}
